package com.itcam.daijia.driver.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Configuration // 表示这是一个配置类，用于配置 Spring 框架中的组件
public class ThreadPoolConfig {

    @Bean // 表示该方法返回的对象会被注册为 Spring 容器中的一个 Bean
    public ThreadPoolExecutor threadPoolExecutor() {
        // 动态获取服务器核数
        int processors = Runtime.getRuntime().availableProcessors();
        // 创建一个线程池，核心线程数为服务器核数加 1，最大线程数也为服务器核数加 1，线程空闲时间为 0 秒，使用无界队列，使用默认线程工厂，使用中止策略
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                processors + 1, // 核心线程个数 io:2n ,cpu: n+1  n:内核数据
                processors + 1,
                0,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        /**
         * I/O密集型：
         * 这类任务或程序的特点是它们花费大量的时间在等待I/O操作（如磁盘读写、网络通信等）的完成上。
         * 由于I/O操作通常比CPU计算慢得多，因此I/O密集型任务的性能瓶颈往往在于I/O子系统的速度，而不是CPU的处理能力。
         * 常见的I/O密集型任务包括：文件传输、数据库查询、网络爬虫等。
         *
         * CPU密集型：
         * 这类任务或程序的特点是它们需要大量的CPU计算资源，而I/O操作相对较少。
         * CPU密集型任务的性能瓶颈通常在于CPU的处理能力，而不是I/O子系统的速度。
         * 常见的CPU密集型任务包括：科学计算、图像处理、视频编码等。
         *
         * I/O密集型任务：由于I/O操作通常比CPU计算慢得多，因此I/O密集型
         * 任务的线程池可以设置较多的核心线程数，以便能够同时处理多个I/O操作。
         * 一般来说，核心线程数可以设置为服务器CPU核心数的2倍。
         *
         * CPU密集型任务：由于CPU密集型任务需要大量的CPU计算资源，因此
         * 线程池中的核心线程数应该设置得较少，以避免过多的线程切换带来的开销。
         * 一般来说，核心线程数可以设置为服务器CPU核心数加1。
         */
        return threadPoolExecutor;
    }
}

